package com.zhm.demo.ssh;

import com.jcraft.jsch.ChannelDirectTCPIP;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.util.Properties;

public class SSHTunnel {
    public static void main(String[] args) {
        String sshHost = "172.24.71.27";
        int sshPort = 22;
        String sshUser = "hcadmin";
        String sshPassword = "Hithium.com12";


        int localPort = 3307; // 本地暴露的端口
        String remoteHost = "your_remote_host"; // MySQL服务器或其他服务的地址
        int remotePort = 3306; // 远程服务的端口

        JSch jsch = new JSch();
        Session session = null;
        ChannelDirectTCPIP channel = null;

        try {
            // 创建SSH会话
            session = jsch.getSession(sshUser, sshHost, sshPort);
            session.setPassword(sshPassword);

            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);

            // 连接SSH服务器
            session.connect();

            // 打开本地到远程的端口转发通道
            int assignedPort = session.setPortForwardingL(localPort, remoteHost, remotePort);
            System.out.println("Local port " + localPort + " forwarded to remote " + remoteHost + ":" + remotePort + " (assigned port: " + assignedPort + ")");

            // 注意：assignedPort 通常与 localPort 相同，除非本地端口已被占用，JSch会尝试分配一个可用的端口

            // 在这里，你可以开始使用本地的3307端口连接到远程的MySQL服务器了
            // 例如，使用MySQL客户端连接到 localhost:3307

            // 为了让这个示例保持运行，我们可以添加一个简单的等待循环（在实际应用中，你可能不需要这样做）
            Thread.sleep(3600000); // 等待一小时（3600000毫秒）


        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭通道和会话
            if (channel != null && channel.isConnected()) {
                channel.disconnect();
            }
            if (session != null && session.isConnected()) {
                session.disconnect();
            }
        }
    }
}
